跳到主要内容

Nacos 服务中心搭建环境

官方文档 Nacos Spring Cloud 快速开始

Nacos 是什么?

Nacos 是一个服务注册中心,也是一个配置中心,这篇笔记就按照官网的配置一步步配置下来,把踩的坑记录下来

搭建 nacos-server

前言:Nacos 自己就是服务中心,所以它不用像 Eureka 那样需要自己配置一个 Server,直接使用阿里提供的 nacos-server 工具安装使用就行了,每个微服务模块都只需要配置服务发现

首先下载安装 nacos-server

wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
tar -xvf nacos-server-2.0.1.tar.gz

启动命令

cd nacos/bin
# 这个 standalone 代表着单机模式运行,非集群模式
sh startup.sh -m standalone

启动失败,检测日志发现是内存不够

# 首先检查当前内存大小
free -h

# 然后可以使用 top 命令监控进程,使用 kill 命令杀掉某个进程

要解决这个问题就要修改这个启动时指定的内存,那么我们修改一下这个启动脚本 startup.sh

vim startup.sh

可以看到这段配置(standalone 的那个):

JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"

将 512 修改为 256 即可

如果出现以下报错:

[[: not found

这是因为 Ubuntu 的 sh 命令无法识别 "[[]]" 表达式。

bash startup.sh -m standalone

然后访问

http://localhost:8848/nacos/#/login

就可以看到界面了,默认账号/密码: nacos/nacos

使用 Nacos 启动配置管理

使用 Nacos 可以很方便做配置中心,如下配置一个简单的 DEMO 来接收变更的配置

官方的源码:nacos-spring-boot-config-example

配置环境

首先引入 Spring Cloud Alibaba 的大礼包

<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

然后主要引入下面两个

<!--整合 actuator 监视服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
</dependency>


在 Spring Boot 添加依赖

<properties>
<nacos-config-spring-boot.version>0.2.7</nacos-config-spring-boot.version>
</properties>

<!-- ............ -->

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>

<!-- 注意!!!在 SpringCloud 要用下面这个依赖,就不用上面那个了 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>

<!-- 同理:nacos-config-spring-boot-actuator 应该使用 SpringCloud 的 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

application.yml 中配置 Nacos server 的地址,以及开放健康检查

nacos:
discovery:
server-addr: 192.168.211.138:8848

management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always

使用 @NacosPropertySource 加载 dataId 为 example 的配置源,并开启自动更新:

@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}

}

通过 Nacos 的 @NacosValue 注解设置属性值。

@RestController()
@RequestMapping("/config")
public class ConfigController {

@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

@GetMapping("/get")
public boolean get() {
return useLocalCache;
}
}

启动测试

启动 NacosConfigApplication,调用

curl http://localhost:8080/config/get

返回内容是 false

通过调用 Nacos Open API 向 Nacos server 发布配置:dataId 为 example,内容为 useLocalCache=true

curl -X POST "http://localhost:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"

再次访问发现返回值已经是 true

curl http://localhost:8080/config/get

启动服务发现

在 Spring Boot 项目中启动 Nacos 的服务发现功能 官方的源码 nacos-spring-boot-discovery-example

配置环境

同理:

<!--整合 actuator 监视服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
</dependency>

<!-- 注意!!!在 SpringCloud 要用下面这个依赖,就不用上面那个了 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml 中配置 Nacos server 的地址,以及开放健康检查

nacos:
discovery:
server-addr: 192.168.211.138:8848

management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always

获取配置信息

使用 @NacosInjected 注入 Nacos 的 NamingService 实例:

@RestController
@RequestMapping("discovery")
public class DiscoveryController {

// 这个注解将 ConfigService 或 NamingService 实例注入目标 Bean 的注解。
@NacosInjected
private NamingService namingService;

@GetMapping("/get")
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
}

启动类默认就行了

@SpringBootApplication
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}

启动测试

启动 NacosDiscoveryApplication,调用,此时返回为空 JSON 数组 []

curl http://localhost:8080/discovery/get?serviceName=example

通过调用 Nacos Open API 向 Nacos server 注册一个名称为 example 服务

curl -X PUT 'http://localhost:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'

如果是 Powershell 中使用 curl.exe 因为 Powershell 中的 curl 为 ps 原生命令 Invoke-WebRequest 的别名。

想要 调用 curl,应在 ps 中输入:curl.exe 及参数,问题解决

curl.exe -X PUT 'http://localhost:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'

可以看到

再次访问

curl.exe http://localhost:8080/discovery/get?serviceName=example

此时返回内容为:

[
{
"instanceId": "127.0.0.1-8080-DEFAULT-example",
"ip": "127.0.0.1",
"port": 8080,
"weight": 1.0,
"healthy": true,
"cluster": {
"serviceName": null,
"name": "",
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {}
},
"service": null,
"metadata": {}
}
]

命名空间和 DataId

命名空间 和 DataId 主要用来解决如下两个问题

问题1:实际开发中,通常一个系统会准备

  1. dev 开发环境
  2. test 测试环境
  3. prod 生产环境

如何保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件呢?

问题2:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?

Nacos 的图形化管理界面

Namespace + Group + DataId 三者关系?为什么这么设计?

它们的关系类似 Java 里面的 package 名和类名最外层的 namespace 是可以用于区分部署环境的,Group 和 DataId 逻辑上区分两个目标对象。

默认情况:Namespace=public,Group=DEFAULT_GROUP,默认 Cluster 是 DEFAULT

1、Nacos 默认的 Namespace 是 public,Namespace 主要用来实现隔离:比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的 Namespace 之间是隔离的。

2、Group 默认是 DEFAULT_GROUP,Group 可以把不同的微服务划分到同一个分组里面去

3、Service 就是微服务:一个 Service 可以包含多个 Cluster(集群),Nacos 默认 Cluster 是 DEFAULT,Cluster 是对指定微服务的一个虚拟划分。比方说为了容灾,将 Service 微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的 Service 微服务起一个集群名称(HZ) ,给广州机房的 Service 微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

4、最后是 Instance,就是微服务的实例。